package com.breeze.blockchain.controller.admin;

import com.breeze.blockchain.auth.util.AppUserUtil;
import com.breeze.blockchain.mybatis.entity.UserDo;
import com.breeze.blockchain.service.UserService;
import com.breeze.components.web.core.ResponseDTO;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import java.io.Serializable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户信息表 控制层。
 *
 * @author breeze
 * @since 2024-04-21 20:47:54
 */
@RestController
@Tag(name = "用户信息表接口")
@RequestMapping("api/admin/user")
public class UserController {

  @Resource UserService userService;

  @Operation(summary = "账户封禁")
  @GetMapping("disable")
  public ResponseDTO<Void> disable(@RequestParam Long id) {
    // 先踢下线
    AppUserUtil.kickout(id);
    // 再封禁账号
    AppUserUtil.disable(id, -1);
    return ResponseDTO.ok();
  }

  @Operation(summary = "账户解禁")
  @GetMapping("untieDisable")
  public ResponseDTO<Void> untieDisable(@RequestParam Long id) {
    AppUserUtil.untieDisable(id);
    return ResponseDTO.ok();
  }

  /**
   * 添加用户信息表。
   *
   * @param userDo 用户信息表
   */
  @PostMapping("save")
  @Operation(summary = "保存用户信息表")
  public ResponseDTO<Void> save(@RequestBody @Parameter(name = "用户信息表") UserDo userDo) {
    userDo.changePwd(userDo.getPassword());
    userService.save(userDo);
    return ResponseDTO.ok();
  }

  /**
   * 根据主键更新用户信息表。
   *
   * @param userDo 用户信息表
   */
  @PostMapping("update")
  @Operation(summary = "根据主键更新用户信息表")
  public ResponseDTO<Void> update(@RequestBody @Parameter(name = "用户信息表主键") UserDo userDo) {
    userDo.changePwd(userDo.getPassword());
    userService.updateById(userDo);
    return ResponseDTO.ok();
  }

  /**
   * 根据用户信息表主键获取详细信息。
   *
   * @param id 用户信息表主键
   * @return 用户信息表详情
   */
  @GetMapping("getInfo/{id}")
  @Operation(summary = "根据主键获取用户信息表")
  public ResponseDTO<UserDo> getInfo(@PathVariable Serializable id) {
    return ResponseDTO.ok(userService.getById(id));
  }

  /**
   * 分页查询用户信息表。
   *
   * @param page 分页对象
   * @return 分页对象
   */
  @GetMapping("page")
  @Operation(summary = "分页查询用户信息表")
  public ResponseDTO<Page<UserDo>> page(
      @Parameter(name = "分页信息") Page<UserDo> page, @Parameter(name = "用户信息表") UserDo userDo) {
    return ResponseDTO.ok(userService.page(page, QueryWrapper.create(userDo)));
  }
}
